


//#include  "global.h"
#include  "string.h"
#include "iotv30_config.h"

#include  "iot_node.h"
 
#include  "iot_node_func.h"
#include "uart_printf.h"
#include <stdio.h>
 

void  iot_NodeFunc_Init(void)
{

	
}




//自动组网生成节点组网信息
// ret=0:fail ;ret>0:ok
uint8_t iot_CCT_Local_DeleteNode(uint8_t* id )
{	

return 1;	 
	
}


//DeleteNodeWithIndex
// ret=0:fail ;ret>0:ok
uint8_t  iot_CCT_Local_DeleteNodeWithIndex(uint8_t idx)
{	

return 1;	 
	
}






// #define  CCT_Top_AddNode  

//自动组网生成节点组网信息
void iot_CCT_Local_AddNode(uint8_t* id ,uint8_t group,uint8_t type)
{

	 
}





// 方法功能: 查找组号对应的节点id,
//输入参数: group_num--需要查找的组号，begin此次开始查找的下标，
//返回参数: *cur返回查找到最近一次节点的下标，*id返回查找到节点的id指针
//返回值:    ret = 0查找失败，ret = 1查找成功
 uint8_t  iot_find_node_id_with_group_number( uint8_t group_num,uint8_t* cur, uint64_t* id)
{
  uint8_t i,begin;
  uint8_t  ret;
	
 uint8_t  node_total;	
 node_total = iot_Node_GetNum( ) ;		
		
 ret = 0;	
	
//	begin = *cur +1;    //?????为什么要加1
	begin = *cur ;	
	
	for(i=begin;i<node_total;i++)
	{
	    if( group_num == iot_NodeConfigObj.Node[i].Config.group ) 
		{
			*id=iot_NodeConfigObj.Node[i].Config.sub_mac;
			*cur = i;  
			ret  = 1; 
			break;		 
		}
	}
	
	return   ret;

}


//ret<0,--没找到匹配项
//ret>=0,--找到匹配项,返回值即为索引-----需要注意==0的情况
int16_t iot_find_node_index_with_id(uint64_t* rcv_id )
{
	uint8_t i;
	int16_t ret;
	
 uint8_t  node_total;	
 node_total = iot_Node_GetNum( ) ;		
	
	ret = -1;
	
	for( i=0;i<node_total;i++ )
	{
		if( iot_NodeConfigObj.Node[i].Config.sub_mac == *rcv_id )
		{
			ret =i;
			break;
		}
			
	}
	
return ret;

}






/////子设备唯一ID（取值范围：1~65535）
//{平台自动生成，与设备类型绑定，下发给网关，网关需要保存}
//根据sub_uid 查找对应的下标
//返回 0=查找失败， !0= 查找成功
uint8_t  iot_find_node_index_with_sub_uid(uint16_t sub_uid,uint8_t* index )
{
 uint8_t i;
 uint8_t  node_total;	
 
   LOG_NAME();

   if( NULL ==index)
   {
	 return 0;
   }

   node_total = iot_Node_GetNum( ) ;

	for( i=0;i<node_total;i++ )
	{
		if( iot_NodeConfigObj.Node[i].Config.sub_uid == sub_uid )
		{
			*index = i;
			 printf("found sub_uid=%d,indx=%d\n",sub_uid,*index);
             return 1;
		}
			
	}
	
   printf("not found sub_uid=%d,indx=%d\n",sub_uid,*index);

return 0;

}





////--------------还需要根据通道编号和通道地址---查找到对应节点的下标------------------------------------------//

//根据sub_uid 查找对应的下标
//返回 0=查找失败， !0= 查找成功

uint8_t  iot_find_node_index_with_info(dev_mod_info_t* info,uint8_t* index )
{
 uint8_t i;
 uint8_t  node_total;	
 
   LOG_NAME();

   if( NULL ==index)
   {
	 return 0;
   }

   node_total = iot_Node_GetNum( ) ;

	for( i=0;i<node_total;i++ )
	{
		if(   ( info->chan_addr  == iot_NodeConfigObj.Node[i].Config.sub_mac  )  &&\
		      ( info->channel    == iot_NodeConfigObj.Node[i].Config.channel   ) )   //&&\
			 // ( info->node_type  == iot_NodeConfigObj.Node[i].Config.node_type )   ) ////上下行协议的note_type不一样
		{
			*index = i;

              printf("found info: chan_addr=%d,channel=%d,node_type=%d,indx=%d\n",info->chan_addr,info->channel,info->node_type ,*index);

             return 1;
		}
			
	}


     printf("not found info: chan_addr=%d,channel=%d,node_type=%d\n",info->chan_addr,info->channel,info->node_type );


return 0;

}





//根据 inddex 查找对应的通道信息
//返回 0=查找失败， !0= 查找成功
uint8_t  iot_get_mod_info_with_index(uint8_t index ,dev_mod_info_t* info)
{
   LOG_NAME();

   if( NULL ==info)
   {
	 return 0;
   }

   if( index >= iot_Node_GetNum( ) )  //debug--ver.01.0B
   {
	 return 0;
   }


    info->chan_addr  = iot_NodeConfigObj.Node[index].Config.sub_mac ;
	info->channel    = iot_NodeConfigObj.Node[index].Config.channel ;
	info->node_type  = iot_NodeConfigObj.Node[index].Config.node_type ;
	//info->pdev_name_str  = iot_NodeConfigObj.Node[index].Config.dev_name_str;//该方法测试没有通过---尚未知道
	info->pdev_name_str  = iot_NodeConfigObj.Node[index].Config.dev_name_str;



    logout("got info:indx=%d, chan_addr=%d,channel=%d,node_type=%x,dev_name=%p\n",index,info->chan_addr,info->channel,info->node_type ,info->pdev_name_str);
	//got info:indx=7, chan_addr=5,channel=1,node_type=d008,dev_name=
    /////got info:indx=3, chan_addr=17,channel=1,node_type=d003,dev_name=0x39dbdf
	
return 1;

}








//根据下标 查找对应的 sub_uid
//返回 0=查找失败， !0= 查找成功 
uint8_t  iot_get_node_sub_uid_with_index( uint8_t index,  uint16_t* sub_uid)
{	
	 if( index >=iot_Node_GetNum( ) )
	 { 
		return 0;		
	 }	 
	 	 
  *sub_uid = iot_NodeConfigObj.Node[index].Config.sub_uid ;

  return 1 ;
  
}






//返回值:    ret = 0查找失败，ret = 1查找成功
 uint8_t  iot_get_node_id_with_index( uint8_t index,uint64_t* id )
{	
	if( index < iot_Node_GetNum( )  )
	{
	   *id=iot_NodeConfigObj.Node[index].Config.sub_mac;
      return 1;		
	}
	
	return 0;	
	
}



//获取索引下标对应的节点ID 指针
//返回值: NULL 查找失败，!NULL查找成功
uint64_t*  iot_get_node_id_point_with_index( uint8_t index )
{	
	
	if( index < iot_Node_GetNum( )  )
	{
        return  &(iot_NodeConfigObj.Node[index].Config.sub_mac); ;		//ok
	}
	
	return  NULL;	//fail
	
}






//B6---获取组号,
//节点的组号： 1~255；注意：组号不能为0, 0--表示全广播
 uint8_t  iot_get_node_group_with_index( uint8_t index)
{
	
	 if( index>=iot_Node_GetNum( ) )
	 { 
		return 0x00;//组号不能为0, 0--表示全广播
	 }	  
	 
	return  iot_NodeConfigObj.Node[index].Config.group ;
}




//---device_id 设备类型
 uint16_t  iot_get_node_type_with_index( uint8_t index)
{
	return  iot_NodeConfigObj.Node[index].Config.node_type ;
}


//B8---node flag 
 uint8_t  iot_get_device_flag_with_index( uint8_t index)
{	
	 if( index>=iot_Node_GetNum( ) )
	 { 
		return 0xFF;
	 }	 
	 	 
	return  iot_NodeConfigObj.Node[index].Flag.all ;
}



void  iot_set_device_name_with_index( uint8_t index, char* pdev_name_str)
{
    LOG_NAME();

	 if( index>=iot_Node_GetNum( ) )
	 { 
		return ;
	 }	

	 if( NULL == pdev_name_str)
	 { 
		return ;
	 }	

	 memset(iot_NodeConfigObj.Node[index].Config.dev_name_str,0, IOT_NODE_DEV_NAME_STR_LEN );
	 strncpy(iot_NodeConfigObj.Node[index].Config.dev_name_str,pdev_name_str, IOT_NODE_DEV_NAME_STR_LEN );
     logout("save device[%d] name =%s\n",index,iot_NodeConfigObj.Node[index].Config.dev_name_str);

}



void  iot_set_device_flag_with_index( uint8_t index, uint8_t flag)
{
	 if( index>=iot_Node_GetNum( ) )
	 { 
		return ;
	 }	
	 
	 iot_NodeConfigObj.Node[index].Flag.all = flag ;
	 
}



void  iot_reset_device_flag( void)
{
uint8_t idx;			
			
 uint8_t  node_total;	
 node_total = iot_Node_GetNum( ) ;			
	
  for( idx=0;idx<node_total; idx++ )
  {	
    iot_NodeConfigObj.Node[idx].Flag.all = 0 ;	
  }
	 
}




//返回0=表示离线，0!=表示在线
 uint8_t  iot_get_device_online_state_with_index( uint8_t index)
{	
	return  iot_NodeConfigObj.Node[index].Flag.bit.online;	 
}



void  iot_set_device_online_state_with_index( uint8_t index, uint8_t state)
{
	
	 if( index>=iot_Node_GetNum( )  )
	 { 
		return ;
	 }	 
	 
	 if( 0 ==state )
	 {
	    iot_NodeConfigObj.Node[index].Flag.bit.online = 0;
	 }else{
	    iot_NodeConfigObj.Node[index].Flag.bit.online = 1;
	 }
	 
}




void  iot_set_device_online_state( uint16_t sub_id, uint8_t state)
{
uint8_t idx;	
	
//	 tmp16 = iot_find_node_index_with_id(sub_id );
	
	 if( !iot_find_node_index_with_sub_uid( sub_id,&idx ) )
	 {//当前节点不存在---	
        return ;
	 }
	 
	 if( 0 ==state )
	 {
	    iot_NodeConfigObj.Node[idx].Flag.bit.online = 0;
	 }else{
	    iot_NodeConfigObj.Node[idx].Flag.bit.online = 1;
	 }
	  
}



void  iot_reset_device_online_state(void)
{
uint8_t idx;			
		
//Lamp_NodeCfgFlags_u flag;
	
 uint8_t  node_total;	
 node_total = iot_Node_GetNum( ) ;	
	
 for( idx=0;idx<node_total; idx++ )
 {	
	 //g_ucNodeData[idx][NODE_STRUCT_INDEX_FLAG] = g_ucNodeData[idx][NODE_STRUCT_INDEX_FLAG] & (~NODE_STRUCT_FLAG_ONLINE_MSK) ;
	 iot_NodeConfigObj.Node[idx].Flag.bit.online = 0;
 }
	 
}



////返回 0=查找失败， !0= 查找成功
 uint8_t  iot_get_device_online_state( uint16_t sub_id, uint8_t* online )
{
uint8_t idx;		

	 if( !iot_find_node_index_with_sub_uid( sub_id,&idx ) )
	 {//当前节点不存在---	
        return 0;
	 }

	*online = iot_NodeConfigObj.Node[idx].Flag.bit.online; 
	 
	return  1;
	 
}





void  iot_reset_device_whitename_added(void)
{
uint8_t idx;			
			
 uint8_t  node_total;	
 node_total = iot_Node_GetNum( ) ;		
	
 for( idx=0;idx<node_total; idx++ )
 {	
	iot_NodeConfigObj.Node[idx].Flag.bit.white_name_added = 0;
 }
	 
}





 uint8_t  iot_get_device_rtc_flag_with_index( uint8_t index)
{
	return  iot_NodeConfigObj.Node[index].Flag.bit.set_node_rtc_done ;  
}



void  iot_set_device_rtc_flag_with_index( uint8_t index, uint8_t state)
{	
	 if( index>=iot_Node_GetNum( )  )
	 { 
		return ;
	 }	
	  
	 if( 0 ==state )
	 {
	    iot_NodeConfigObj.Node[index].Flag.bit.set_node_rtc_done = 0;
	 }else{
	    iot_NodeConfigObj.Node[index].Flag.bit.set_node_rtc_done = 1;
	 }
	  
}




void  iot_set_device_update_flag_with_index( uint8_t index, uint8_t state)
{	
	 if( index>=iot_Node_GetNum( )  )
	 { 
		return ;
	 }	
	 	 
	 if( 0 ==state )
	 {
	    iot_NodeConfigObj.Node[index].Flag.bit.update_done = 0;
	 }else{
	    iot_NodeConfigObj.Node[index].Flag.bit.update_done = 1;
	 }
	 
}





void  iot_set_device_update_flag_with_id( uint16_t sub_id, uint8_t state)
{
uint8_t idx;	
	
	
//	 tmp16 = iot_find_node_index_with_id( sub_id );

	 if( !iot_find_node_index_with_sub_uid( sub_id,&idx ) )
	 {//当前节点不存在---	 
         return ;
	 }
	 
	 
	 if( 0 ==state )
	 {
	    iot_NodeConfigObj.Node[idx].Flag.bit.update_done = 0;
	 }else{
	    iot_NodeConfigObj.Node[idx].Flag.bit.update_done = 1;
	 }
	 
	 
}






// //返回配置节点的数量
//  uint8_t  iot_Node_get_config_node_number( void)
// {	
// 	return   iot_Node_GetNum( ) ;

// }
















